home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
cc
/
cc.c
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
7KB
|
293 lines
#define PROGRAM \
"CC.EXE コンパイラ・ドライバ V1.04 1991.06.30 by Y.Kurihara (Nif PDC01620)"
#define HELP \
"\n使い方 CC [-new] [@file] [ソース(.c) ...] [オブジェクト.obj ...] <オプション>" \
"\n ソース(.c) ソース より新しい オブジェクト があれば、コンパイルしない" \
"\n オブジェクト.obj カレントディレクトリ になければ、環境変数 LIB386 のパスを探す" \
"\n @file コマンドファイル file を読み込む" \
"\n" \
"\n オプション (他のオプションはコイパイラのマニュアルを参照)" \
"\n -new(-n) 全てのソースをコンパイルする" \
"\n -env var=val 環境変数を設定する" \
"\n -test(-t) コンパイラ、リンカを実行しない" \
"\n -offset 省略形(-off)は使用不可" \
"\n" \
"\n 環境変数" \
"\n PATH386 *.exp形式ファイルを置くディレクトリ" \
"\n LIB386 オブジェクト/ライブラリ を置くディレクトリ" \
"\n STDOPT 常に使用するオプション" \
"\n" \
"\n ☆本プロクラムは LSI C-86 Ver 3.20 試食版 でコンパイルしました。"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "function.h"
#include "opttbl.h"
FILE *fp_obj,*fp_opt; /* リンク用のコマンドファイル */
char *src_lst[32]; /* ソースファイルの一覧 */
char *exp_arg[32]; /* EXPファイル実行時の引数 */
int flg_new = 0; /* -new オプションのフラグ */
int flg_tst = 0; /* -test オプションのフラグ */
char **cc_src,**cc_opt;
int opt_type,opt_num;
int error_level = 0;
void main( int argc,char *argv[] );
void make_command( char **argv ); /* パラメータを分類する */
void mk_cmd2( char *arg );
void mk_cmd3( char *opt );
void mk_cmd4( char *file );
char *FindLib( char *lib ); /* ライブラリを検索する */
void exec_compile( void ); /* コンパイル & リンクの実行 */
int exec_exp( char *exp,char *argv[] ); /* *.EXP ファイルを実行する */
void main( int argc,char *argv[] )
{
puts( PROGRAM );
if( argc <= 1 ) {
puts( HELP );
exit( 0 );
}
make_command( argv );
exec_compile();
exit( error_level );
}
void make_command( char **argv ) /* パラメータを分類する */
{
char *stdopt;
fp_obj = fopen( "object.lnk","w" );
if( fp_obj == NULL ) goto error1;
fp_opt = fopen( "option.lnk","w" );
if( fp_opt == NULL ) goto error2;
cc_src = src_lst;
cc_opt = exp_arg + 3;
opt_type = opt_num = 0;
stdopt = getenv("STDOPT");
if( stdopt ) stdopt = strdup( stdopt );
mk_cmd3( stdopt );
opt_type = opt_num = 0;
while( *(++argv) ) mk_cmd2( *argv );
*cc_src = *cc_opt = NULL;
fclose( fp_obj );
fclose( fp_opt );
return;
error1:
fprintf( stdout,"%s:オープンできません\n","object.lnk" );
exit(2);
error2:
fprintf( stdout,"%s:オープンできません\n","option.lnk" );
exit(2);
}
void mk_cmd2( char *arg )
{
struct OPT_TBL *opt;
if( arg[0] == '@' ) { /* コマンドファイルの処理 */
opt_type = opt_num = 0;
mk_cmd4( arg + 1 );
opt_type = opt_num = 0;
return;
}
if( arg[0] == '-' ) { /* オプションの処理 */
if( opt = FindOption( arg ) ) {
opt_type = opt->type;
opt_num = opt->num;
} else {
opt_type = opt_num = 0;
fprintf( stdout,"%s:不正なオプションです\n",arg );
error_level = 2;
return;
}
switch( opt_type ) {
case _HIGH:
*cc_opt++ = strdup( arg );
break;
case _LINK:
case _LIB:
fprintf( fp_opt,"%s\n",arg );
break;
case _NEW:
flg_new = 1;
break;
case _TEST:
flg_tst = 1;
break;
}
return;
}
if( opt_num != 0 ) { /* オプションのパラメータの処理 */
switch( opt_type ) {
case _HIGH:
*cc_opt++ = strdup( arg );
break;
case _LINK:
fprintf( fp_opt,"%s\n",arg );
break;
case _LIB:
fprintf( fp_opt,"%s\n",FindLib( arg ) );
break;
case _ENV:
putenv( strdup( arg ) );
break;
}
if( --opt_num == 0 ) opt_type = opt_num = 0;
return;
} else { /* ソースファイルの処理 */
char src[64],obj[22],*ext;
strcpy( src,arg );
ext = SearchExt( src );
if( *ext == 0 ) strcpy( ext,".c" );
if ( strcmpi( ext,".obj" ) == 0 ) {
fprintf( fp_obj,"%s\n",FindLib( src ) );
return;
}
strcpy( obj,SearchFile( src ) );
strcpy( SearchExt( obj ),".obj" );
*cc_src++ = strdup( src );
*cc_src++ = strdup( obj );
fprintf( fp_obj,"%s\n",obj );
return;
}
return;
}
void mk_cmd3( char *opt )
{
char buff[64],*p;
if( opt == NULL ) return;
while( isspace( *opt ) ) opt++;
while( *opt && *opt != '!' ) {
p = buff;
while( *opt && !isspace( *opt ) && *opt != '!' ) {
*p++ = *opt++;
}
*p = 0;
mk_cmd2( buff );
while( isspace( *opt ) ) opt++;
if( opt_type == _ENV ) { /* -env のパラメータの処理 */
mk_cmd2( opt );
break;
}
}
return;
}
void mk_cmd4( char *file )
{
static FILE *fp_cmd = NULL;
char buf[100],*p;
if( fp_cmd != NULL ) goto error1;
fp_cmd = fopen( file,"r" );
if( fp_cmd == NULL ) goto error1;
while( fgets( buf,100,fp_cmd ) ) {
buf[99] = 0;
for( p = buf; *p; p++ ) {
if( *p == '\r' || *p == '\n' ) {
*p = 0;
break;
}
}
if( buf[0] == '/' ) continue;
if( buf[0] == '*' ) break;
mk_cmd3( buf );
}
fclose( fp_cmd );
fp_cmd = NULL;
return;
error1:
fprintf( stdout,"%s:オープンできません\n",file );
error_level = 2;
return;
}
char *FindLib( char *lib ) /* ライブラリを検索する */
{
static char file[64];
char *lib386,*ext;
lib386 = getenv("LIB386");
strcpy( file,lib );
ext = SearchExt( file );
if( *ext == 0 ) strcpy( ext,".lib" );
lib = FindFile( file,lib386 );
if( lib == NULL ) return( file );
return( lib );
}
void exec_compile( void ) /* コンパイル & リンクの実行 */
{
int ret;
cc_src = src_lst;
while( *cc_src ) {
if( flg_new ||
FileTime( cc_src[0] ) >= FileTime( cc_src[1] ) ) {
exp_arg[2] = *cc_src;
ret = exec_exp( "HC386P.EXP",exp_arg );
if( ret > 0 ) error_level = 1;
}
cc_src += 2;
}
if( error_level < 1 ) {
exp_arg[2] = "@object.lnk";
exp_arg[3] = "@option.lnk";
exp_arg[4] = NULL;
ret = exec_exp( "TLINKP.EXP",exp_arg );
if( ret > 0 ) error_level = 1;
}
return;
}
int exec_exp( char *exp,char *argv[] ) /* *.EXP ファイルを実行する */
{
int ret;
char **p;
char *path386;
path386 = getenv("PATH386");
argv[0] = "RUN386.EXE";
argv[1] = FindFile( exp, path386 );
if( argv[1] == NULL ) goto error1;
fprintf( stdout,"\n" );
for( p = argv; *p; fprintf( stdout,"%s ",*p++ ) );
fprintf( stdout,"\n" );
if( flg_tst ) return( 0 );
ret = spawnvp( 0, argv[0],argv);
fprintf( stdout,"Exit Code = %d\n",ret );
if( ret < 0 ) goto error2;
return( ret );
error1:
fprintf( stdout,"%s:実行できません\n",exp );
exit(2);
error2:
fprintf( stdout,"%s:実行できません\n",*argv );
exit(2);
}